#include "Destination.h"
#include <iostream>
#include <map>

using namespace std;


//! La classe TableRoutage permet de définir une table de routage.
/*!
 Une table de routage est caractérisée par l'id du routeur qui possède la table de routage, le nombre de routeur qu'il a dans sa table et le coût pour accéder à un routeur particulier.
 */
class TableRoutage {
	
private:
    //! id du routeur qui possède la table de routage.
	int idRouteur;
    //! nombre de routeur qu'il a dans la table.
	int nbRouteur;
    // TODO: A compléter... (num du voisin / numRouteur destination et coût)
	map<int, Destination> table;
	
    
public:
    //! Contructeur permettant de créer une nouvelle table de routage avec l'id du routeur qui possèdera la table et le nombre de routeur qu'il y aura dedans.
    /*!
     \param idRouteur l'id du routeur qui possèdera la table de routage.
     \param nbRouteur le nombre de routeur qu'il y aura dans la table de routage.
     */
	TableRoutage(int idRouteur, int nbRouteur);
    
    //! Destructeur de la classe Destination.
	~TableRoutage();
	
    
    //! Ajoute une destination dans la table de routage.
    /*!
     \param numRouteurDest le numéro du routeur destinataire.
     \param numRouteurPassage le numéro du voisin par lequel on doit passer pour se rendre au routeur destinataire.
     \param coutLiaison le coût pour accéder au routeur destinataire.
     */
	void ajouteDestination(int numRouteurDest, int numRouteurPassage, int coutLiaison);
    
    //! Modifie une destination déjà présente dans la table de routage.
    /*!
     \param numRouteurDest le numéro du routeur destinataire.
     \param numRouteurPassage le numéro du voisin par lequel on doit passer pour se rendre au routeur destinataire.
     \param coutLiaison le coût pour accéder au routeur destinataire.
     */
	void modifierDestination(int numRouteurDest, int numRouteurPassage, int coutLiaison);
	
	//! Force la modification d'une destination déjà présente dans la table de routage.
    /*!
     \param numRouteurDest le numéro du routeur destinataire.
     \param numRouteurPassage le numéro du voisin par lequel on doit passer pour se rendre au routeur destinataire.
     \param coutLiaison le coût pour accéder au routeur destinataire.
     */
	void forceModifierDestination(int numRouteurDest, int numRouteurPassage, int coutLiaison);
	
    
    //! Décrit la classe TableRoutage.
    /*!
     \param description la description d'une table de routage.
     */
	void toString(char *description);
    
    //! Affiche la table de routage dans la console.
    void afficher();
    
    
    //! Retourne la table de routage.
    /*!
     \return La table de routage.
     */
	map<int,Destination> getTable();
    
    //! Retourne le voisin permettant d'accéder au routeur destinataire.
    /*!
     \param routeurDestination le routeur destinataire.
     \return Le voisin permettant d'accéder au routeur destinataire.
     */
    int getRouteurPassage(int routeurDestination);
};
